<!DOCTYPE html>
<html lang="en">

<!-- Head tag -->
<head><meta name="generator" content="Hexo 3.8.0">

    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!--Description-->

    

    
        <meta name="description" content="一、什么是FEC我们都知道IP协议是不可靠的传输协议，而建立在IP协议之上的TCP和UDP，一个是可靠协议，一个是不可靠协议。TCP协议之所以可靠，是因为它有滑动窗口、重传等一系列措施保障，而UDP却没有。
当然，TCP由于增加了一系列措施，所以延时较高，UDP简单，所以延时相对较低。但是有的时候，">
    

    <!--Author-->
    
        <meta name="author" content="Cyrus">
    

    <!--Open Graph Title-->
    
        <meta property="og:title" content="iOS使用openfec">
    

    <!--Open Graph Description-->
    
        <meta property="og:description" content="一、什么是FEC我们都知道IP协议是不可靠的传输协议，而建立在IP协议之上的TCP和UDP，一个是可靠协议，一个是不可靠协议。TCP协议之所以可靠，是因为它有滑动窗口、重传等一系列措施保障，而UDP却没有。
当然，TCP由于增加了一系列措施，所以延时较高，UDP简单，所以延时相对较低。但是有的时候，">
    

    <!--Open Graph Site Name-->
        <meta property="og:site_name" content="Cyrus的技术空间">

    <!--Type page-->
    
        <meta property="og:type" content="article">
    

    <!--Page Cover-->
    
    
        <meta property="og:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

        <meta name="twitter:card" content="summary_large_image">

    

    
        <meta name="twitter:image" content="http://cyrus_huang.gitee.io/bloghttp://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg">
    

    <!-- Title -->
    
    <title>iOS使用openfec - Cyrus的技术空间</title>

    <!-- Bootstrap Core CSS -->
    <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet">

    <!-- Custom CSS -->
    <link rel="stylesheet" href="/blog/css/style.css">

    <!-- Custom Fonts -->
    <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Lora:400,700,400italic,700italic" rel="stylesheet" type="text/css">
    <link href="//fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">

    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
    <script src="//oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
    <script src="//oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <!-- Gallery -->
    <link href="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.css" type="text/css" rel="stylesheet">

    <!-- Google Analytics -->
    


    <!-- favicon -->
    

</head>


<body>

    <!-- Menu -->
    <!-- Navigation -->
<nav class="navbar navbar-default navbar-custom navbar-fixed-top">
    <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header page-scroll">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
            <a class="navbar-brand" href="/blog/">Cyrus的技术空间</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
            <ul class="nav navbar-nav navbar-right">
                
                    <li>
                        <a href="/blog/">
                            
                                Home
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/archives">
                            
                                Archives
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/tags">
                            
                                Tags
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="/blog/categories">
                            
                                Categories
                            
                        </a>
                    </li>
                
                    <li>
                        <a href="https://github.com/klugjo/hexo-theme-clean-blog">
                            
                                <i class="fa fa-github fa-stack-2x"></i>
                            
                        </a>
                    </li>
                
            </ul>
        </div>
        <!-- /.navbar-collapse -->
    </div>
    <!-- /.container -->
</nav>

    <!-- Main Content -->
    <!-- Page Header -->
<!-- Set your background image for this header in your post front-matter: cover -->

<header class="intro-header" style="background-image: url('http://www.codeblocq.com/assets/projects/hexo-theme-clean-blog/img/home-bg.jpg')">
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <div class="post-heading">
                    <h1>iOS使用openfec</h1>
                    
                    <span class="meta">
                        <!-- Date and Author -->
                        
                            Posted by Cyrus on
                        
                        
                            2019-11-29
                        
                    </span>
                </div>
            </div>
        </div>
    </div>
</header>

<!-- Post Content -->
<article>
    <div class="container">
        <div class="row">

            <!-- Tags and categories -->
           
                <div class="col-lg-4 col-lg-offset-2 col-md-5 col-md-offset-1 post-tags">
                    
                        

<a href="/blog/categories/流媒体/">流媒体</a>

                    
                </div>
                <div class="col-lg-4 col-md-5 post-categories">
                    
                </div>
            

            <!-- Gallery -->
            

            <!-- Post Main Content -->
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <h4 id="一、什么是FEC"><a href="#一、什么是FEC" class="headerlink" title="一、什么是FEC"></a>一、什么是FEC</h4><p>我们都知道IP协议是不可靠的传输协议，而建立在IP协议之上的TCP和UDP，一个是可靠协议，一个是不可靠协议。TCP协议之所以可靠，是因为它有滑动窗口、重传等一系列措施保障，而UDP却没有。</p>
<p>当然，TCP由于增加了一系列措施，所以延时较高，UDP简单，所以延时相对较低。但是有的时候，我们又想延时低，又想保证数据的可靠性，没错，就是这么贪心，怎么办呢？于是就出现了常见的两种方式：FEC和ARQ。</p>
<ul>
<li><p>ARQ 自动重传请求（Automatic Repeat-reQuest，ARQ）,简单地说就是接收方发现丢包后，去发送方请求重传。具体实现可以看看KCP(<a href="https://github.com/skywind3000/kcp),整个协议只有" target="_blank" rel="noopener">https://github.com/skywind3000/kcp),整个协议只有</a> ikcp.h, ikcp.c两个源文件，可以方便的集成到项目中，这里就不细说了。</p>
</li>
<li><p>FEC 前向纠错也叫前向纠错码(Forward Error Correction，简称FEC)。FEC是前向冗余，举个例子，发送数据A和B，增加发送一个数据C等于A和B的异或。接收方接到这3个包的任意2个包，异或一下就可以得到第3个包。</p>
</li>
</ul>
<p>两者的说明，区别等在网上都可以查得到，如<a href="https://blog.csdn.net/dxpqxb/article/details/79567297" target="_blank" rel="noopener">https://blog.csdn.net/dxpqxb/article/details/79567297</a>  这些都不是本文的重点。fec常用的开源项目有好几个，这里只讲openfec。</p>
<h4 id="二、编译openfec"><a href="#二、编译openfec" class="headerlink" title="二、编译openfec"></a>二、编译openfec</h4><p>1、下载源码<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">http://openfec.org/accueil.html</span><br></pre></td></tr></table></figure></p>
<p>2、正常编译<br>在源码目录下的“README”就有教如何编译，当然是基于cmake的，具体怎么装自行百度。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">// 进入源码目录</span><br><span class="line">mkdir build  //创建build文件夹，避免cmake生成文件与源文件混在一起，常规操作</span><br><span class="line">cd build</span><br><span class="line"></span><br><span class="line">cmake .. -DDEBUG:STRING=OFF		// 生成Release版本</span><br><span class="line">cmake .. -DDEBUG:STRING=ON		// 生成Debug版本</span><br><span class="line"></span><br><span class="line">生成的文件在源码目录的 bin/&#123;Debug|Release&#125; 文件夹里</span><br></pre></td></tr></table></figure></p>
<h4 id="三、编译iOS使用的openfec库"><a href="#三、编译iOS使用的openfec库" class="headerlink" title="三、编译iOS使用的openfec库"></a>三、编译iOS使用的openfec库</h4><p>下面进入正题，说说如何编译iOS使用的版本：</p>
<p>1、 在源码的src文件夹里，打开CMakeLists.txt：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">将第三行的：</span><br><span class="line">add_library(openfec  SHARED  $&#123;openfec_sources&#125;)</span><br><span class="line"></span><br><span class="line">改为：</span><br><span class="line">add_library(openfec  STATIC  $&#123;openfec_sources&#125;)</span><br><span class="line"></span><br><span class="line">// 这样修改是将编译成的库由动态库改为静态库，iOS用动态库有时会出问题，建议使用静态库。普通编译不想用动态库也可以这么改。</span><br></pre></td></tr></table></figure></p>
<p>2、在源码目录，创建build文件夹，进入并执行 cmake -G Xcode ..<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir build</span><br><span class="line">cd build</span><br><span class="line">cmake -G Xcode ..</span><br></pre></td></tr></table></figure></p>
<p>这样，就会在build目录下生成一个xcode项目，如下图：<br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_1.png" alt=""><br>相信对于从事iOS的人来说，相对于cmake,看到.xcodeproj肯定倍感亲切。</p>
<p>3、打开项目，现在是项目还是基于Mac平台的，操作如下图：<br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_2.png" alt=""><br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_3.png" alt=""><br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_4.png" alt=""><br>恭喜你，你已经得到了模拟器和真机运行需要的静态库了。</p>
<p>4、合成fat库<br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_5.png" alt=""></p>
<p>5、将需要的头文件拷贝出来<br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_6.png" alt=""><br>现在，我们已经得到iOS环境下的静态库和头文件夹了，赶快建个项目测试一下吧。</p>
<p>6、项目测试<br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_7.png" alt=""><br><img src="http://cyrus_huang.gitee.io/blog/2019/11/29/iOS使用openfec/fec_8.png" alt=""></p>


                
            </div>

            <!-- Comments -->
            
                <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                    


                </div>
            
        </div>
    </div>
</article>

    <!-- Footer -->
    <hr>

<!-- Footer -->
<footer>
    <div class="container">
        <div class="row">
            <div class="col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1">
                <ul class="list-inline text-center">
                    

                    

                    
                        <li>
                            <a href="https://github.com/klugjo/hexo-theme-clean-blog" target="_blank">
                                <span class="fa-stack fa-lg">
                                    <i class="fa fa-circle fa-stack-2x"></i>
                                    <i class="fa fa-github fa-stack-1x fa-inverse"></i>
                                </span>
                            </a>
                        </li>
                    

                    

                    

                    
                </ul>
                <p class="copyright text-muted">&copy; 2020 Cyrus<br></p>
                <p class="copyright text-muted">Original Theme <a target="_blank" href="http://startbootstrap.com/template-overviews/clean-blog/">Clean Blog</a> from <a href="http://startbootstrap.com/" target="_blank">Start Bootstrap</a></p>
                <p class="copyright text-muted">Adapted for <a target="_blank" href="https://hexo.io/">Hexo</a> by <a href="http://www.codeblocq.com/" target="_blank">Jonathan Klughertz</a></p>
                <p class="copyright text-muted"><a href="http://www.beian.miit.gov.cn">粤ICP备18110122号-1</a></p>
            </div>
        </div>
    </div>
</footer>


    <!-- After footer scripts -->
    
<!-- jQuery -->
<script src="//code.jquery.com/jquery-2.1.4.min.js"></script>

<!-- Bootstrap -->
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<!-- Gallery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/featherlight/1.3.5/featherlight.min.js" type="text/javascript" charset="utf-8"></script>

<!-- Disqus Comments -->



</body>

</html>